Consumers and businesses increasingly run computer software within virtual machines. Virtual machines may be managed by a virtualization platform referred to as a hypervisor. A hypervisor may manage multiple virtual machines on a single host computing system. When multiple virtual machines run on a single system under a hypervisor, they may attempt to access the same resource, such as a Central Processing Unit (CPU) or a storage device, at the same time. While operating systems of the virtual machines may have schedulers that attempt to balance loads on resources, the operating systems may not be aware of other virtual machines attempting to access the same resources. Unfortunately, traditional hypervisors do not effectively manage access to shared resources.
Traditional hypervisors may only provide limited resource-load management for virtual machines. For example, a hypervisor may limit use of a resource for each virtual machine it manages. This approach may result in inefficiencies when one virtual machine is not using its full portion of the resource and another virtual machine could perform better with access to more than its portion of the resource.
In another approach, a hypervisor may dynamically schedule and allocate resources among virtual machines. However, hypervisors that implement dynamic resource allocation only address resource utilization at a single point in time and may not be aware of present or future needs of their virtual machines. Also, these hypervisors do not allow operating systems of virtual machines to cooperate to manage load distribution over time. As a result, a high priority process from one virtual machine may be delayed when a lower priority process from another virtual machine is monopolizing a shared resource.